package wt.rocket.ctrl.persona;

import java.util.Date;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.*;
import wt.rocket.model.servicios.ServicioPersona;
import wt.rocket.util.UtilFechas;

/**
 *
 * @author Waytech
 */
public class CtrlPersonaDatosBasicos extends GenericForwardComposer {

  //widgets
  Div divMensaje;
  Label etqMensaje;
  Textbox txtCedula, txtNombre, txtTelefono, txtEmail;
  Label etqCedula, etqNombre, etqTelefono, etqEmail, etqDpto, etqFechaNacimiento;
  A btnEditDpto;
  //data
  private ServicioPersona servicioLider;
  private String cedula = "";
  private String nombre = "";
  private String nombreDpto = "";
  //este id debe buscarse de la base de datos
  private int idLider = 1;
  //variables de control:
  private boolean cedulaProcesada;
  //fecha apertura:
  private Datebox dateboxFechaNacimiento;
  private String FechaNacimiento = "01-01-1900"; //valor por defecto si no se elige ninguna fecha
  Date dateFechaNacimiento = new Date(); //fecha por defecto, si no ha sido elegida ninguna

  @Override
  public void doAfterCompose(Component comp) throws Exception {
    super.doAfterCompose(comp);
    inicio();
  }

  public void inicio() {
    servicioLider = new ServicioPersona();
    //PENDIENTE: se debe buscar el id de líder que se está viendo
    //PENDIENTE: se debe llenar la lista de Dptos

  }

  //TODO: mover este método para el final
  /**
   * muestra un mensaje para interacción con el usuario, en la parte superior
   * del formulario
   *
   * @param msj el mensaje a mostrar
   */
  private void mensaje(String msj) {
    etqMensaje.setValue(msj);
    etqMensaje.setVisible(true);
    System.out.println(this.getClass().toString() + msj);
  }

  //TODO: mover este método para el final
  /**
   * limpia el mensaje de estado
   */
  private void ocultarMensaje() {
    etqMensaje.setValue("");
    etqMensaje.setVisible(false);
  }

  //MANEJO DE EDICION DE CAMPO CEDULA
  public void onClick$etqCedula() {
    cedula = etqCedula.getValue();
    activarEditCedula();
  }

  /**
   * simula buscar el id del líder
   */
  public int getIdLider() {
    return 1;
  }

  private void activarEditCedula() {
    ocultarMensaje();
    etqCedula.setVisible(false);
    txtCedula.setValue(cedula);
    txtCedula.setVisible(true);
    txtCedula.setFocus(true);
  }

  public void onOK$txtCedula() {
    procesarCedula();
  }

  public void onBlur$txtCedula() {
    //if para evitar actualización doble
    if (!cedulaProcesada) {
      procesarCedula();
    }
    cedulaProcesada = false;
  }

  private void procesarCedula() {
    cedulaProcesada = false;
    ocultarMensaje();
    String nuevaCedula = txtCedula.getValue();
    //quitar espacios en blanco
    nuevaCedula = nuevaCedula.trim();
    if (nuevaCedula.equals(cedula)) {//no se cambió el valor
      cancelarEditCedula();
      cedulaProcesada = true;
      return;
    }
    if (!cedulaEnUso(nuevaCedula)) {//cédula ingresada disponible
      cedula = nuevaCedula.toUpperCase();
      actualizarCedula();
      cedulaProcesada = true;
      cancelarEditCedula();
      etqCedula.setValue(cedula);
    }
  }

  void cancelarEditCedula() {
    txtCedula.setVisible(false);
    etqCedula.setVisible(true);
  }

  /**
   * busca en la base de datos si la cédula ya está en uso devuelve true o false
   * si existe o no. además muestra mensaje de error cuando es necesario. Para
   * efectos del curso La búsqueda en la base de datos es simulada
   *
   * @return
   */
  boolean cedulaEnUso(String cedula) {
    if (servicioLider.existeCedula(cedula)) {
      mensaje("Esta cédula ya está registrada: " + cedula);
      return true;
    }
    return false;
  }

  /**
   * actualiza la cédula en la base de datos
   */
  void actualizarCedula() {
    if (servicioLider.actualizarCedula(getIdLider(), cedula)) {
      mensaje("Se actualizó la cédula");
    } else {
      mensaje("Error: No se pudo actualizar la cédula");
    }
  }

  //MANEJO DE EDICION DE CAMPO NOMBRE
  public void onClick$etqNombre() {
    activarEditNombre();
  }

  private void activarEditNombre() {
    nombre = etqNombre.getValue();
    etqNombre.setVisible(false);
    txtNombre.setValue(nombre);
    txtNombre.setVisible(true);
    txtNombre.setFocus(true);
  }

  private void cancelarEditNombre() {
    txtNombre.setVisible(false);
    etqNombre.setVisible(true);
    etqNombre.setFocus(true);
  }

  public void onOK$txtNombre() {
    procesarNombre();
    cancelarEditNombre();
  }

  public void onBlur$txtNombre() {
    procesarNombre();
    cancelarEditNombre();
  }

  private void procesarNombre() {
    ocultarMensaje();
    String nuevoValor = txtNombre.getValue();
    nuevoValor = nuevoValor.trim();
    if (nuevoValor.isEmpty() || nuevoValor.equals(nombre)) {//no se cambió el valor
      return;
    }
    nombre = nuevoValor;
    actualizarNombre();
    etqNombre.setValue(nombre);
  }

  /**
   * actualiza el nombre de la célula en la base de datos
   */
  void actualizarNombre() {
    if (servicioLider.actualizarNombre(getIdLider(), nombre)) {
      mensaje("Se actualizó el nombre");
    } else {
      mensaje("Error: no se pudo actualizar el nombre");
    }
  }

  public void onClick$etqFechaNacimiento() {
    activarEditFechaNacimiento();
  }

  public void onBlur$dateboxFechaNacimiento() {
    procesarValorFechaNacimiento();
    desactivarEditFechaNacimiento();
  }

  public void onChange$dateboxFechaNacimiento() {
    procesarValorFechaNacimiento();
    desactivarEditFechaNacimiento();
  }

  private void activarEditFechaNacimiento() {
    etqFechaNacimiento.setVisible(false);
    //TODO: asignar al datebox fecha que está en la variable
    dateboxFechaNacimiento.setVisible(true);
    dateboxFechaNacimiento.setValue(dateFechaNacimiento);
    dateboxFechaNacimiento.setFocus(true);
    dateboxFechaNacimiento.open();
  }

  private void desactivarEditFechaNacimiento() {
    dateboxFechaNacimiento.setVisible(false);
    etqFechaNacimiento.setVisible(true);
  }

  private void procesarValorFechaNacimiento() {
    FechaNacimiento = procesarFechaNacimiento();
    //TODO: alguna validación que sea necesaria
    etqFechaNacimiento.setValue(FechaNacimiento);
  }

  String procesarFechaNacimiento() {
    dateFechaNacimiento = dateboxFechaNacimiento.getValue();
    if (dateFechaNacimiento != null) {
      FechaNacimiento = UtilFechas.getFechaTexto(dateFechaNacimiento);
    } else {
      FechaNacimiento = "";
    }
    return FechaNacimiento;
  }
}